home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / ifgate / ifdbm.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-04  |  2.6 KB  |  155 lines

  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <errno.h>
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include <sys/stat.h>
  7. #ifdef HAS_NDBM_H
  8. #include <fcntl.h>
  9. #include <ndbm.h>
  10. #else
  11. #include <dbm.h>
  12. #endif
  13. #include "lutil.h"
  14. #include "config.h"
  15.  
  16. static int opened=0;
  17. #ifdef HAS_NDBM_H
  18. static DBM *alias_db = NULL;
  19. #endif
  20.  
  21. static int init(void)
  22. {
  23.     char buf[128];
  24.     struct stat stbuf;
  25.     FILE *fp;
  26.     int tries;
  27.  
  28.     if (database == NULL) return -1;
  29.     if (opened == -1) return -1;
  30.     if (opened) return 0;
  31.     sprintf(buf,"%s.dir",database);
  32.     if (stat(buf,&stbuf) != 0)
  33.     {
  34.         sprintf(buf,"%s.dir",database);
  35.         fp=fopen(buf,"a");
  36.         if (fp) fclose(fp);
  37.         sprintf(buf,"%s.pag",database);
  38.         fp=fopen(buf,"a");
  39.         if (fp) fclose(fp);
  40.     }
  41.     for (tries=0;(1);tries++)
  42.     {
  43. #ifdef HAS_NDBM_H
  44.         if ((alias_db=dbm_open(database,O_RDWR,0600)) != NULL)
  45. #else
  46.         if (dbminit(database) == 0)
  47. #endif
  48.         {
  49.             opened = 1;
  50.             return 0;
  51.         }
  52.         else if ((tries > 5) || (errno != EAGAIN))
  53.         {
  54.             logerr("$could not open alias database");
  55.             opened = -1;
  56.             return -1;
  57.         }
  58.         else
  59.             sleep(2);
  60.     }
  61. }
  62.  
  63. void registrate(freename,address)
  64. char *freename,*address;
  65. {
  66.     datum key,val;
  67.     char buf[128],*p,*q;
  68.     int first;
  69.  
  70.     if (init()) return;
  71.  
  72.     strncpy(buf,freename,sizeof(buf)-1);
  73.     first=1;
  74.     for (p=buf,q=buf;*p;p++) switch (*p)
  75.     {
  76.     case '.':    *p=' '; /* fallthrough */
  77.     case ' ':    if (first)
  78.             {
  79.                 *(q++)=*p;
  80.                 first=0;
  81.             }
  82.             break;
  83.     default:    *(q++)=*p;
  84.             first=1;
  85.             break;
  86.     }
  87.     *q='\0';
  88.     debug(6,"registrate \"%s\" \"%s\"",buf,address);
  89.     key.dptr=buf;
  90.     key.dsize=strlen(buf);
  91. #ifdef HAS_NDBM_H
  92.     val=dbm_fetch(alias_db,key);
  93. #else
  94.     val=fetch(key);
  95. #endif
  96.     if (val.dptr) return;
  97.     else
  98.     {
  99.         val.dptr=address;
  100.         val.dsize=strlen(address);
  101. #ifdef HAS_NDBM_H
  102.         if (dbm_store(alias_db,key,val,0) != 0)
  103. #else
  104.         if (store(key,val) != 0)
  105. #endif
  106.             logerr("$cannot store: \"%s\" \"%s\"",buf,address);
  107.         else loginf("registered \"%s\" as \"%s\"",buf,address);
  108.     }
  109. }
  110.  
  111. char *lookup(freename)
  112. char *freename;
  113. {
  114.     datum key,val;
  115.     static char buf[128],*p,*q;
  116.     int sz,first;
  117.  
  118.     if (init()) return NULL;
  119.  
  120.     strncpy(buf,freename,sizeof(buf)-1);
  121.     first=1;
  122.     for (p=buf,q=buf;*p;p++) switch (*p)
  123.     {
  124.     case '.':    *p=' '; /* fallthrough */
  125.     case ' ':    if (first)
  126.             {
  127.                 *(q++)=*p;
  128.                 first=0;
  129.             }
  130.             break;
  131.     default:    *(q++)=*p;
  132.             first=1;
  133.             break;
  134.     }
  135.     *q='\0';
  136.     debug(6,"lookup \"%s\"",freename);
  137.     key.dptr=buf;
  138.     key.dsize=strlen(buf);
  139. #ifdef HAS_NDBM_H
  140.     val=dbm_fetch(alias_db,key);
  141. #else
  142.     val=fetch(key);
  143. #endif
  144.     if (val.dptr)
  145.     {
  146.         sz=val.dsize;
  147.         if (sz > (sizeof(buf)-1)) sz=sizeof(buf)-1;
  148.         strncpy(buf,val.dptr,sz);
  149.         buf[sz]='\0';
  150.         debug(6,"found: \"%s\"",buf);
  151.         return(buf);
  152.     }
  153.     else return NULL;
  154. }
  155.